﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Interfaces;
using Controller;

namespace GUI
{
    public partial class frmUdfoerOpgave : Form
    {
        Iordre ordre;
        Iopgave opgave;
        GuiVareliste gVareListe = new GuiVareliste();
        OrdreController oc = new OrdreController();

        public frmUdfoerOpgave(Iordre ordre, Iopgave opgave)
        {
            this.ordre = ordre;
            this.opgave = opgave;
            InitializeComponent();
        }
        private void frmUdfoerOpgave_Load(object sender, EventArgs e)
        {
            lblOpgaveNavn.Text = opgave.Navn;
            txtOpgavebeskrivelse.Text = opgave.Beskrivelse;
            lblOrdreNr.Text = Convert.ToString(ordre.Ordrenummer);
            OpgaveController opgc = new OpgaveController();
            OrdreController ordc = new OrdreController();

            VareController vc = new VareController();
            List<Ivare> vareListe = vc.HentAlleVarer();

            lvVarer.Items.Clear();
            foreach (Ivare vare in vareListe)
            {
                string[] str = { Convert.ToString(vare.Varenummer), vare.Navn};
                ListViewItem lvItem = new ListViewItem(str);
                lvVarer.Items.Add(lvItem);
            }

            List<Ivare> vareliste = opgc.HentVarerTildeltOrdreOpgave(ordre.Ordrenummer, opgave.Opgavenummer);
        }

        private void lvVarer_SelectedIndexChanged(object sender, EventArgs e)
        {
            picTilfoejVareTilOpgave.Enabled = true;
        }

        private void btnTilfoejVareTilOpgave_Click(object sender, EventArgs e)
        {
            int valgtVareNr = Convert.ToInt32(lvVarer.SelectedItems[0].SubItems[0].Text);
            string valgtVareNavn = lvVarer.SelectedItems[0].SubItems[1].Text;

            GuiVare vare = new GuiVare(valgtVareNr, valgtVareNavn);
            gVareListe.tilfoejVare(oc, ordre.Ordrenummer, vare);

            gVareListe.fyldListview(lvVarerTilfoejetOpgaven);
        }

        private void lvVarerTilfoejetOpgaven_SelectedIndexChanged(object sender, EventArgs e)
        {
            picFjernVareFraOpgave.Enabled = true;
        }

        private void btnFjernVareFraOpgave_Click(object sender, EventArgs e)
        {
            string valgtVaresNavn = lvVarerTilfoejetOpgaven.SelectedItems[0].SubItems[1].Text;
            gVareListe.sletVare(oc, valgtVaresNavn);
            gVareListe.fyldListview(lvVarerTilfoejetOpgaven);
        }

        private void btnOpretNyVare_Click(object sender, EventArgs e)
        {
            frmOpretVare opretNyVare = new frmOpretVare();
            opretNyVare.ShowDialog();
        }

        private void btnLukVindue_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }


    class GuiVareliste
    {
        private GuiVareliste foersteListeElement;
        private GuiVareliste naesteListeElement = null;
        private GuiVare foersteVareElement;

        public GuiVareliste()
        {

        }

        public void tilfoejVare(OrdreController oc, int ordreNr, GuiVare nyVare)
        {

            if (foersteListeElement == null)
            {
                foersteListeElement = new GuiVareliste();
            }

            GuiVareliste aktuelVareListe = foersteListeElement;

            while (aktuelVareListe != null)
            {
                if (aktuelVareListe.foersteVareElement == null)
                {
                    aktuelVareListe.foersteVareElement = nyVare;
                    aktuelVareListe = aktuelVareListe.naesteListeElement;
                }
                else
                {
                    if (aktuelVareListe.foersteVareElement.vareNummer == nyVare.vareNummer)
                    {
                        nyVare.naesteVare = aktuelVareListe.foersteVareElement;
                        aktuelVareListe.foersteVareElement = nyVare;
                        aktuelVareListe = null;
                    }
                    else
                    {

                        if (aktuelVareListe.naesteListeElement == null)
                        {
                            GuiVareliste nyVareliste = new GuiVareliste();
                            nyVareliste.foersteVareElement = nyVare;
                            aktuelVareListe.naesteListeElement = nyVareliste;
                            aktuelVareListe = nyVareliste;
                        }
                        aktuelVareListe = aktuelVareListe.naesteListeElement;
                    }
                }
            }
            nyVare.storageId = oc.TilfoejVareTilOrdre(ordreNr, nyVare.vareNummer);
        }

        public void sletVare(OrdreController oc, string vareNavn)
        {
            GuiVareliste aktuelVareListe = foersteListeElement;
            GuiVareliste forrigeVareliste = null;

            while (aktuelVareListe != null)
            {
                if (aktuelVareListe.foersteVareElement != null)
                {
                    if (aktuelVareListe.foersteVareElement.vareNavn == vareNavn)
                    {
                        oc.sletVareFraOrdre(aktuelVareListe.foersteVareElement.storageId);
                        aktuelVareListe.foersteVareElement = aktuelVareListe.foersteVareElement.naesteVare;

                        

                        if (aktuelVareListe.foersteVareElement == null)
                        {
                            if (forrigeVareliste != null)
                            {
                                forrigeVareliste.naesteListeElement = aktuelVareListe.naesteListeElement;
                            }
                            else
                            {
                                foersteListeElement = aktuelVareListe.naesteListeElement;
                            }
                        }
                    }
                }
                forrigeVareliste = aktuelVareListe;
                aktuelVareListe = aktuelVareListe.naesteListeElement;
            }
        }

        public void fyldListview(ListView lv)
        {
            lv.Items.Clear();
            int antalVarer = 0;
            string vareNavn = "";

            GuiVareliste aktuelVareliste = foersteListeElement;
            GuiVare aktueltVareElement = null;

            while (aktuelVareliste != null)
            {
                aktueltVareElement = aktuelVareliste.foersteVareElement;

                while (aktueltVareElement != null)
                {
                    if (vareNavn == "")
                    {
                        vareNavn = aktueltVareElement.vareNavn;
                    }
                    antalVarer++;
                    aktueltVareElement = aktueltVareElement.naesteVare;
                }
                aktuelVareliste = aktuelVareliste.naesteListeElement;

                string[] str = { Convert.ToString(antalVarer), vareNavn };
                ListViewItem lvItem = new ListViewItem(str);

                
                lv.Items.Add(lvItem);

                vareNavn = "";
                antalVarer = 0;
            }


        }

    }
}
